/**
 * File Name   : ProductBankService.java
 * Description : 
 */
package com.hh.admin.product.bankfinancial.service;

import java.sql.SQLException;

import org.apache.log4j.Logger;

import com.hh.admin.product.bankfinancial.form.ParamProductBankBean;
import com.hh.admin.product.bankfinancial.form.ProductBankForm;
import com.hh.admin.product.bankfinancial.form.ResultProductBankBean;
import com.hh.common.ibatis.dao.IQueryDao;
import com.hh.common.ibatis.dao.IUpdateDao;
import com.hh.portal.products.form.ParamPortalProductsBean;

/**
 * 银行理财产品内容管理Service
 * @author 冯昌硕
 * @create 2013-1-4 下午8:48:22
 * @modify 2013-2-2 feng 删除方法getProductBankInfoList(ProductBankForm form)，改用公共Service提供的方法
 */
public class ProductBankService {
    
    private static final Logger log = Logger.getLogger(ProductBankService.class);
    
    private IQueryDao queryDao;
    
    private IUpdateDao updateDao;
    
    /**
     * 删除银行理财产品记录
     * @param id 产品ID
     * @param productTypeId 产品类型ID
     * @return
     * @throws SQLException
     * @create 2013-1-5 下午7:23:01
     * @modify 2013-02-09 15:53 添加参数productTypeId，删除内容记录同时删除公共表记录
     */
    public int deleteOneBankProductInfo(int id, int productTypeId) throws SQLException {
        
        int delRs = -1;
        
        try {
            updateDao.startTransaction();
            delRs = updateDao.delete("productbank.deleteBankProductInfo", id);
            log.debug("[deleteOneBankProductInfo] contentId=["+id+"] productTypeId=[" + productTypeId + "] [productbank.deleteBankProductInfo删除影响记录行数[" + delRs+ "]]");
            
            ParamPortalProductsBean paramBean = new ParamPortalProductsBean();
            paramBean.setProductContentId(id);
            paramBean.setProductTypeId(productTypeId);
            int delRs2 = updateDao.delete("commonProduct.deleteCommonProduct", paramBean);
            log.debug("[deleteOneBankProductInfo] contentId=["+id+"] productTypeId=[" + productTypeId + "] [commonProduct.deleteCommonProduct删除影响记录行数[" + delRs2 + "]]");
            
            updateDao.commitTransaction();
        } finally {
            updateDao.endTransaction();
        }
        
        return delRs;
    }
    
    /**
     * 批量删除产品记录
     * @param ids 要删除的产品ID
     * @return
     * @throws SQLException
     * @create 2013-1-5 下午7:31:14
     */
    public int deleteManyProducttype(Integer[] ids, int productTypeId) throws SQLException {
        
        int result = -1;
        try {
            updateDao.startTransaction();
            
            updateDao.startBatch();
            
            if((ids == null) || (ids.length <= 0)) {
                log.info("批量删除[productbank.deleteBankProductInfo]参数数组为空，不作处理");
                return result;
            }
            
            // 批处理删除内容表记录
            for(Object paramObj : ids) {
                updateDao.delete("productbank.deleteBankProductInfo", paramObj);
            }
            
            //result = updateDao.executeBatch();
            
            // 批处理删除公共内容表记录
            log.debug("[deleteManyProducttype]批量删除公共内容表记录，产品类型[" + productTypeId + "]");
            for(Integer paramObj : ids) {
                ParamPortalProductsBean paramBean = new ParamPortalProductsBean();
                paramBean.setProductContentId(paramObj);
                paramBean.setProductTypeId(productTypeId);
                updateDao.delete("commonProduct.deleteCommonProduct", paramBean);
            }
            
            result = updateDao.executeBatch();
            
            updateDao.commitTransaction();
        } catch(SQLException e) {
            log.error("[deleteManyProducttype] 批处理异常： " + e.toString());
            throw e;
        } finally {
            updateDao.endTransaction();
        }
        
        return result;
    }
    
    /**
     * 添加产品记录
     * @param form
     * @return
     * @throws SQLException 
     * @create 2013-1-5 下午11:09:35
     * @modify 2013-02-07 11:25 添加产品记录同时记入到common_product表，加入事务管理
     */
    public int insertBankProduct(ProductBankForm form) throws SQLException {
        ParamProductBankBean paramBean = new ParamProductBankBean();
        paramBean.setProductName(form.getProductName()); // 产品名称
        paramBean.setBank(form.getBank());               // 发行银行
        paramBean.setCurrency(form.getCurrency());       // 币种
        paramBean.setTimeLimit(form.getTimeLimit());     // 委托期
        paramBean.setEarningsStartDate(form.getEarningsStartDate()); // 收益起计日
        paramBean.setStartDate(form.getStartDate());     // 销售起始日期
        paramBean.setEndDate(form.getEndDate());         // 销售终止日期
        paramBean.setPaymentCycle(form.getPaymentCycle()); // 付息周期(天)
        paramBean.setExpectedProfit(form.getExpectedProfit()); // 预期最高年化收益率
        paramBean.setProductType(form.getProductType()); // 产品类型
        paramBean.setStartAmount(form.getStartAmount()); // 起购金额/委托起始金额 (万元)
        paramBean.setEarningsType(form.getEarningsType()); // 收益类型
        paramBean.setPlaceArea(form.getPlaceArea());     // 发售地区
        paramBean.setIncrementBy(form.getIncrementBy()); // 递增单位(元)
        paramBean.setFees(form.getFees());               // 产品管理费
        paramBean.setBreakEven(form.getBreakEven());     // 是否保本
        paramBean.setPlaceStatus(form.getPlaceStatus()); // 在售状态(0-未开始销售；1-正在销售中;2-已结束销售)
        paramBean.setEarlyTermCond(form.getEarlyTermCond()); // 提前终止条件
        paramBean.setProductDesc(form.getProductDesc()); // 产品说明
        paramBean.setEariningsDesc(form.getEariningsDesc()); // 收益率说明
        paramBean.setCreaterUser(form.getCreaterUser()); // 记录创建人
        paramBean.setStatus(form.getStatus());           // 内容状态：0-草稿；1-发布
        
        Integer productbankAddCnt = -1;
        try {
            updateDao.startTransaction();
            
            productbankAddCnt = (Integer) updateDao.insert("productbank.insertContent", paramBean);
            log.debug("[insertBankProduct] productbank.insertContent result = [" + productbankAddCnt + "]");
            
            ParamPortalProductsBean portalParam = new ParamPortalProductsBean();
            portalParam.setProductTypeId(form.getProductTypeId()); // 产品类型ID,参照表product_type的id字段
            portalParam.setStatus(form.getStatus());               // 内容状态(0-草稿;1-发布)
            portalParam.setProductName(form.getProductName());     // 产品名称
            portalParam.setProductContentId(productbankAddCnt);    // 产品记录内容ID
            
            int portalInsertRs = (Integer) updateDao.insert("commonProduct.insertCommonProduct", portalParam);
            log.debug("[insertBankProduct] commonProduct.insertCommonProduct result = [" + portalInsertRs + "]");
            
            updateDao.commitTransaction();
        } finally {
            updateDao.endTransaction();
        }
        
        return productbankAddCnt;
    }
    
    /**
     * 根据记录ID获取银行理财产品详情
     * @param id 记录ID
     * @return
     * @throws ClassCastException
     * @throws SQLException
     * @create 2013-1-6 下午10:01:26
     */
    public ResultProductBankBean getBankProductDetail(int id) throws ClassCastException, SQLException {
        return queryDao.queryForObject("productbank.selBankProductInfo", id, ResultProductBankBean.class);
    }
    
    /**
     * 更新记录
     * @param form
     * @return
     * @throws SQLException
     * @create 2013-1-6 下午10:55:48
     */
    public int updateBankProductInfo(ProductBankForm form) throws SQLException {
        ParamProductBankBean paramBean = new ParamProductBankBean();
        paramBean.setId(form.getId());
        paramBean.setProductName(form.getProductName()); // 产品名称
        paramBean.setBank(form.getBank());               // 发行银行
        paramBean.setCurrency(form.getCurrency());       // 币种
        paramBean.setTimeLimit(form.getTimeLimit());     // 委托期
        paramBean.setEarningsStartDate(form.getEarningsStartDate()); // 收益起计日
        paramBean.setStartDate(form.getStartDate());     // 销售起始日期
        paramBean.setEndDate(form.getEndDate());         // 销售终止日期
        paramBean.setPaymentCycle(form.getPaymentCycle()); // 付息周期(天)
        paramBean.setExpectedProfit(form.getExpectedProfit()); // 预期最高年化收益率
        paramBean.setProductType(form.getProductType()); // 产品类型
        paramBean.setStartAmount(form.getStartAmount()); // 起购金额/委托起始金额 (万元)
        paramBean.setEarningsType(form.getEarningsType()); // 收益类型
        paramBean.setPlaceArea(form.getPlaceArea());     // 发售地区
        paramBean.setIncrementBy(form.getIncrementBy()); // 递增单位(元)
        paramBean.setFees(form.getFees());               // 产品管理费
        paramBean.setBreakEven(form.getBreakEven());     // 是否保本
        paramBean.setPlaceStatus(form.getPlaceStatus()); // 在售状态(0-未开始销售；1-正在销售中;2-已结束销售)
        paramBean.setEarlyTermCond(form.getEarlyTermCond()); // 提前终止条件
        paramBean.setProductDesc(form.getProductDesc()); // 产品说明
        paramBean.setEariningsDesc(form.getEariningsDesc()); // 收益率说明
        paramBean.setStatus(form.getStatus());           // 内容状态：0-草稿；1-发布
        
        int result = -1;
        
        try {
            updateDao.startTransaction();
            
            result = updateDao.update("productbank.updateBankProduct", paramBean);
            
            ParamPortalProductsBean param = new ParamPortalProductsBean();
            param.setProductName(form.getProductName());     // 产品名称
            param.setStatus(form.getStatus());               // 内容状态：0-草稿；1-发布
            param.setProductTypeId(form.getProductTypeId()); // 产品类型ID,参照表product_type的id字段
            param.setProductContentId(form.getId());         // 产品记录内容ID
            updateDao.update("commonProduct.updateCommonProduct", param);
            
            updateDao.commitTransaction();
        } finally {
            updateDao.endTransaction();
        }
        
        return result;
    }

    public void setQueryDao(IQueryDao queryDao) {
        this.queryDao = queryDao;
    }

    public void setUpdateDao(IUpdateDao updateDao) {
        this.updateDao = updateDao;
    }

}
